package mybox.engine;

import java.util.ArrayList;


public class Pfadstueck {
	
	public static final String O="O";
	public static final String N="N";
	public static final String W="W";
	public static final String S="S";
	public static final String L1="1";
	public static final String L2="2";
	public static final String L3="3";
	public static final String L4="4";
	
	public String orientierung;
	public int    wiederholung;
	
	public static  String[][] PYRAMIDE = {
			  				{O,L3},
			  				{N,L1},
			  				{W,L1},
			  				{N,L1},
			  				{W,L1},
			  				{S,L1},
			  				{W,L1},
			  				{S,L1}
            			};
	
	public Pfadstueck(String orientierung, int wiederholung) {
		this.orientierung=orientierung;
		this.wiederholung=wiederholung;
	}
	
	public static double angle(String orientierung) {
		double angle=0;
		
		if (orientierung.equalsIgnoreCase("O")) angle=0;
		if (orientierung.equalsIgnoreCase("N")) angle=java.lang.Math.PI/2;
		if (orientierung.equalsIgnoreCase("W")) angle=java.lang.Math.PI;
		if (orientierung.equalsIgnoreCase("S")) angle=3*java.lang.Math.PI/2;
		
		return angle;
	}
	
	public static ArrayList<Pfadstueck> calcPfad(String[] pfadArrStr) {
		
		ArrayList<Pfadstueck> pfadList = new ArrayList<Pfadstueck>();
		
		int pfadTeilLaenge=1;
		for (int pfadIdx=0;pfadIdx<pfadArrStr.length;pfadIdx++) {
			if (isInteger(pfadArrStr[pfadIdx])) {
				pfadTeilLaenge=Integer.parseInt(pfadArrStr[pfadIdx]);
			} else {
			    pfadList.add(new Pfadstueck(pfadArrStr[pfadIdx],pfadTeilLaenge));
			    pfadTeilLaenge=1;
			}
		}		
		return pfadList;
	}
	
	public static ArrayList<Pfadstueck> calcPfad(String[][] pfadArrStr) {
		
		ArrayList<Pfadstueck> pfadList = new ArrayList<Pfadstueck>();		
		
		for (int pfadIdx=0;pfadIdx<pfadArrStr.length;pfadIdx++) {
			String orientierung=pfadArrStr[pfadIdx][0];
			int laenge=Integer.parseInt(pfadArrStr[pfadIdx][1]);
			pfadList.add(new Pfadstueck(orientierung,laenge));
		}
				
		return pfadList;
	}
	
	public static boolean isAussenEcke(ArrayList<Pfadstueck> pfadList, int posFrom_p, int posTo_p) 
	throws Exception {
		boolean isAussen=false;
		
		 int posFrom=(posFrom_p+pfadList.size())%pfadList.size();
		 int posTo = (posTo_p+pfadList.size())%pfadList.size();
		
		if (!(posTo-posFrom==1 || (posFrom==pfadList.size()-1 && posTo==0)))
			throw new Exception("wrong Aussenecke Parameter");
			
		if (pfadList.get(posFrom).orientierung.equalsIgnoreCase("N")
			&& pfadList.get(posTo).orientierung.equalsIgnoreCase("O")
				) isAussen=false;
		
		if (pfadList.get(posFrom).orientierung.equalsIgnoreCase("N")
				&& pfadList.get(posTo).orientierung.equalsIgnoreCase("W")
					) isAussen=true;
		
		if (pfadList.get(posFrom).orientierung.equalsIgnoreCase("O")
				&& pfadList.get(posTo).orientierung.equalsIgnoreCase("N")
					) isAussen=true;
			
		if (pfadList.get(posFrom).orientierung.equalsIgnoreCase("O")
					&& pfadList.get(posTo).orientierung.equalsIgnoreCase("S")
						) isAussen=false;
		
		if (pfadList.get(posFrom).orientierung.equalsIgnoreCase("S")
				&& pfadList.get(posTo).orientierung.equalsIgnoreCase("O")
					) isAussen=true;
			
		if (pfadList.get(posFrom).orientierung.equalsIgnoreCase("S")
					&& pfadList.get(posTo).orientierung.equalsIgnoreCase("W")
						) isAussen=false;
		
		if (pfadList.get(posFrom).orientierung.equalsIgnoreCase("W")
				&& pfadList.get(posTo).orientierung.equalsIgnoreCase("N")
					) isAussen=false;
			
		if (pfadList.get(posFrom).orientierung.equalsIgnoreCase("W")
					&& pfadList.get(posTo).orientierung.equalsIgnoreCase("S")
						) isAussen=true;
						
		return isAussen;
	}
	
	public boolean isWaagrecht() {
		return orientierung.equalsIgnoreCase("W")||orientierung.equalsIgnoreCase("O");		
	}
	
	
	public static boolean isInteger(String testVal) {
		boolean isInt;	
		try {
			Integer.parseInt(testVal);
			isInt=true;
		} catch (Exception ex) {
			isInt=false;
		}	
		return isInt;
	}

}
